//
//  "$Id: VideoOut.h 91860 2012-12-08 09:18:30Z li_weijun $"
//
//  Copyright (c)1992-2007, ZheJiang Dahua Technology Stock CO.LTD.
//  All Rights Reserved.
//
//	Description:	
//	Revisions:		Year-Month-Day  SVN-Author  Modification
//

#ifndef __VIDEO_OUT_API_H__
#define __VIDEO_OUT_API_H__

#include "Types.h"
#include "VideoIn.h"

#ifdef __cplusplus
extern "C" {
#endif

/// \defgroup VideoOutAPI API Video Output
/// 视频输出接口
///	\n 调用流程图:
/// \code
///    =================================
///                   |                            
///         getVideoOutputChannels
///                   |
///           createVideoOutput
///                   |
///                addRef
///                   |
///                getCaps
///                   |
///                enumModes
///                   |
///                setMode
///                   |
///                getMode
///                   |
///               setColor
///                   |
///               antiDither
///                   |
///              setStandard
///                   |
///           setBackgroundColor
///                   |
///              enableLayer
///                   |
///                layout
///                   |
///               setMargin
///                   |
///                release
///                   |                            
///    =================================
/// \endcode
/// @{

/// 视频输出信号适配器类型
typedef enum VideoOutFormat
{
	videoOutputAuto = 0,	///< 自动选择
	videoOutputVGA,			///< Video Graphic Array，接VGA设备
	videoOutputTV,			///< BT565或BT601格式，接TV设备
	videoOutputDVI,			///< Digital Visual Interface，接LCD设备
	videoOutputHDMI,		///< High Definition Multimedia Interface
	videoOutputCVBS,		///< Composite Video Broadcast Signal
	videoOutputBT1120,		///< BT1120
	videoOutputMIPI,		///< MIPI输出
} VideoOutFormat;


/// 视频输出分割模式掩码
typedef enum VideoOutputSplitMode
{
	vidoOutputSplitSingle,	///< 仅支持单画面分割
	vidoOutputSplitSharp,	///< 仅支持'#'型分割（包含单画面分割）
	vidoOutputSplitAny,		///< 支持任意分割
} VideoOutputSplitMode;

///  视频输出特性结构，128字节
typedef struct VideoOutCaps
{
	char setColor;		///< 是否支持输出颜色设置。
	char setMargin;		///< 是否支持边界设置。
	char layers;		///< 支持同时显示的图层数。
	char splitMode;		///< 支持的画面分割模式，见 VideoOutputSplitMode
	char moniterConnect;///< 是否支持监视器连接状态检测，0-不支持，1-支持
	char reserved1[3];
	int reserved[30];	///< 保留字节
} VideoOutCaps;				

/// 视频输出模式，32位系统下128字节
typedef struct VideoOutMode
{
	int				width;			///< 水平分辨率
	int				height;			///< 垂直分辨率
	VideoOutFormat	format : 8;		///< VideoOutFormat类型
	int				bpp : 8;		///< 颜色位数，位/像素
	int				refreshRate : 8;///< 监视器刷新频率，0表示使用缺省频率。
	int				adapterIndex : 8;///< 同类适配器的编号，不同的输出不能同时使用同一个适配器
	int				reserved[29];	///< 保留字节
}VideoOutMode;


/// 视频输出接口，512字节
typedef struct VideoOutput
{
	/// 底层私有数据
	void *priv;


	/// 增加接口引用
	int (*addRef)(struct VideoOutput *thiz);


	/// 释放接口
	int (*release)(struct VideoOutput *thiz);


	/// 得到视频支持的特性。
	/// 
	/// \param [in] thiz 视频输出接口指针
	/// \param [out] caps 指向视频输出特性结构VideoOutCaps的指针。
	/// \retval 0  获取成功。
	/// \retval <0  获取失败。
	int (*getCaps)(struct VideoOutput *thiz, VideoOutCaps * caps);


	/// 枚举视屏输出显示模式
	///
	/// \param [in] thiz 视频输出接口指针
	/// \param [in] modes 输出模式数组VideoOutMode指针
	/// \param [in,out] number 输入为需要获取的数目，输出为取得的数目 
	int (*enumModes)(struct VideoOutput *thiz, VideoOutMode* modes, int* number);


	/// 设置视屏输出显示模式，设置后该视频输出相关的视频表面可能需要重新layout。
	/// 
	/// \param [in] thiz 视频输出接口指针
	/// \param [in] mode 输出模式结构VideoOutMode指针
	int (*setMode)(struct VideoOutput *thiz, VideoOutMode* mode);


	/// 获取视屏输出显示模式。
	/// 
	/// \param [in] thiz 视频输出接口指针
	/// \param [in] mode 输出模式结构VideoOutMode指针
	/// \retval 0  获取成功。
	/// \retval <0  获取失败。
	int (*getMode)(struct VideoOutput *thiz, VideoOutMode* mode);


	/// 设置视频输出的颜色参数。
	/// 
	/// \param [in] thiz 视频输出接口指针
	/// \param [in] color 指向颜色结构VideoColor的指针。
	/// \retval 0  设置成功
	/// \retval <0  设置失败
	int (*setColor)(struct VideoOutput *thiz, VideoColor *color);


	/// 保留
	int (*reserved1)(struct VideoOutput *thiz);


	/// 设置视频输出制式。
	/// 
	/// \param [in] thiz 视频输出接口指针
	/// \param [in] standard 视频制式，取VideoStandard类型的值。
	/// \retval 0  设置成功
	/// \retval <0  设置失败
	int (*setStandard)(struct VideoOutput *thiz, int standard);	


	/// 设置视频输出的背景颜色，初始状态下，整个区域都是背景颜色。
	/// 
	/// \param [in] thiz 视频输出接口指针
	/// \param [in] color 要设置的颜色。
	/// \retval =0  操作成功。
	/// \retval <0	UNIX标准错误码的负数。
	int (*setBackgroundColor)(struct VideoOutput *thiz, Color *color);


	/// 使能视频输出图层。
	/// 
	/// \param [in] thiz 视频输出接口指针
	/// \param [in] index 表面序号，约定如下：0-视频层，1-图形层。初始状态下两个
	///                   层都是开启的。
	/// \param [in] enable 0-禁止该图层，1-显示该图层。
	/// \retval 0  设置成功
	/// \retval <0  设置失败
	int (*enableLayer)(struct VideoOutput *thiz, int layer, int enable);


	/// 将视频输入合成到视频输出。
	/// 
	/// \param [in] thiz 视频输出接口指针
	/// \param [in] surface 视频表面接口指针
	/// \param [in] enable 0-禁止该表面，1-显示该表面。
	/// \param [in] src 输入视频的缩放区域，如果坐标都为0表示不显示该输入的内容。
	/// \param [in] dest 缩放后在输出中的视频区域，该区域会自动加一个边框。
	/// \param [in] zorder 源表面在目标表面的Z轴顺序，值越大，表面越靠顶层，0表示最底层，
	///              不能取负数。
	/// \retval 0  设置成功
	/// \retval <0  设置失败
	int (*layout)(struct VideoOutput *thiz, VideoSurface *surface, int enable, Rect *src,
		Rect *dest, int zorder);

	
	/// 设置视频输出的边界。视频显示在某些监视器上时， 4个边上会有损失。这个函数
	/// 的目的就是设置4个边界压缩的比例，使视频落在监视器的可视区域内。调节范围
	/// 0-100是一个示意值，实际上对应缩小的尺寸需要在底层做转换和限制。
	/// 
	/// \param [in] thiz 视频输出接口指针
	/// \param [in] rect 每个成员表示对应方向上边界的收缩比率，取值0-100， 默认值为0。
	/// \retval 0  设置成功。
	/// \retval <0  设置失败。
	int (*setMargin)(struct VideoOutput *thiz, Rect* rect);

	
	/// 设置视频输出图像通透性模式。
	/// 
	/// \param [in] thiz 视频输出接口指针
	/// \param [in] enable 是否使能，1-开启图像增强，0-关闭图像增强。
	/// \retval 0  设置成功。
	/// \retval <0  设置失败。
	int (*setIQIMode)(struct VideoOutput *thiz, int enable);


	/// 获取视频输出监视器连接状态
	/// 
	/// \param thiz [in] 视频输出接口指针
	/// \param state [in] 状态指针，0-未接监视器，1-已接监视器
	/// \retval 0  获取成功。
	/// \retval <0  获取失败。
	int (*isMonitorConnected)(struct VideoOutput *thiz, int* state);


	///< 保留字节
	void* reserved[112];
} VideoOutput;


/// 得到视频输出的通道数目。
/// 
/// \param 无
/// \return 视频输出接口指针数目。
int getVideoOutputChannels(void);


/// 视频输入接口描述，128字节
typedef struct VideoOutDesc
{
	int				channel;		///< 视频输出物理通道号
	VideoStandard	standard;		///< 视频制式
	int 			card;			///< 子卡槽位号，0表示主板，>0表示子卡
	int				reserved[29];	///< 保留
} VideoOutDesc;


/// 创建视屏输出接口
///
/// \param [in] desc 视频输出接口描述结构VideoInDesc指针
/// \param [out] videoOutput 视频输出接口指针的指针
/// \retval <0 创建失败
/// \retval 0 创建成功
int PAL_API createVideoOutput(VideoOutDesc *desc, VideoOutput **videoOutput);


/// @} end of group


#ifdef __cplusplus
}
#endif

#endif //__VIDEO_OUT_API_H__

